package servlets;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Random;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import logica.*;
import entidades.*;

/**
 * Servlet implementation class ABMPersonasServlet
 */
@WebServlet("/ABMPersonasServlet")
public class ABMPersonasServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ABMPersonasServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession(true);	
		
		String opcion = request.getParameter("opt");
		session.setAttribute("opcion", opcion);
		
		String id = (request.getParameter("id").toString());
		Persona personaActual = new Persona();
		loPersonas lp = new loPersonas();
		
		if(!id.equals("null")){
			personaActual = lp.getPersona(Integer.parseInt(id));
			session.setAttribute("personaActual", personaActual);
		}
		
		if (opcion.equalsIgnoreCase("editar") || opcion.equalsIgnoreCase("agregar")){
			ABMMateriasServlet planes = new ABMMateriasServlet();
			planes.cargarPlanesEspecialidad(request, response);
			request.getRequestDispatcher("AltaModifPersona.jsp").forward(request, response);
		}
		else if (opcion.equalsIgnoreCase("borrar")){
			borrarPersona(Integer.parseInt(id), personaActual, request, response);
			mostrarPersonas(response,request);
			request.getRequestDispatcher("ABMPersonas.jsp").forward(request, response);
		}

	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession(true);	
		altaModifPersona(request, response);
		session.removeAttribute("msgPersonaError");
	}
	
	public void borrarPersona(int id, Persona personaActual, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		loPersonas lp = new loPersonas();
		HttpSession session = request.getSession(true);	
		loUsuarios lu = new loUsuarios();
		loCursos lc = new loCursos();
		
		Persona personaSession = new Persona();
		personaSession = (Persona)session.getAttribute("currentSessionPersona");
		
		if (id == personaSession.getId()){
            String msg = "No puede eliminar su propio usuario.";
            session.setAttribute("msgPersonaError", msg);
        }
        else
        {
        	session.removeAttribute("msgPersonaError");
        	lu.borrarUsuario(personaActual.getUsuario().getId());
        	lp.borrarPersona(id);
        	
        	//Al borrar una persona tambien borramos todas las incripciones a cursos que pudiese tener.
        	lc.borrarInscripcionDeAlumno(id);
        }
	}
	
	public void altaModifPersona(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
	 	Persona personaActual = new Persona();
	 	Plan planActual = new Plan();
	 	loPersonas lp = new loPersonas();
	 	loUsuarios lu = new loUsuarios();
	 	loPlanes lop = new loPlanes();
	 	HttpSession session = request.getSession(true);
	 	
	 	//Datos de la Persona
	 	personaActual.setLegajo(Integer.parseInt(request.getParameter("legajo")));
	 	personaActual.setApellido(request.getParameter("apellido"));
	 	personaActual.setNombre(request.getParameter("nombre"));
	 	personaActual.setIdPlan(Integer.parseInt(request.getParameter("plan")));
	 	
	 	planActual = lop.getPlan(Integer.parseInt(request.getParameter("plan")));
	 	personaActual.setDescPlan(planActual.getDescripcion());
	 	
	 	personaActual.setEmail(request.getParameter("email"));
	 	personaActual.setDireccion(request.getParameter("direccion"));
	 	personaActual.setTelefono(request.getParameter("telefono"));
	 	personaActual.setFecha_nac(request.getParameter("fecNac"));
	 	personaActual.setTipoPersona(Tipo_Persona.convertToTipoPersona(Integer.parseInt(request.getParameter("tipoPersona"))));
	 	
	 	//Datos del Usuario
	 	
	 	String id = request.getParameter("id");
	 	
	 	if(id == null || id.isEmpty()){ //Agrega
	 		//Tengo que agregar primero a la persona para poder conseguir su ID
	 	    lp.agregarPersona(personaActual);
	 	    
	 	    Usuario nuevoUsuario = new Usuario();
            nuevoUsuario.setNombreUsuario(generaUsuario(personaActual));
            nuevoUsuario.setClave(generaClave());
            nuevoUsuario.setNombre(personaActual.getNombre());
            nuevoUsuario.setApellido(personaActual.getApellido());
            nuevoUsuario.setEmail(personaActual.getEmail());
            nuevoUsuario.setHabilitado(true);
            nuevoUsuario.setIdPersona(lp.getUltimoIDPersona());
            
            lu.agregarUsuario(nuevoUsuario);
            
            //Mandarlo a un jsp donde diga el nombre de usuario y la clave
            String msg = "Nombre Usuario: "+nuevoUsuario.getNombreUsuario()+"\nClave: "+nuevoUsuario.getClave();
            session.setAttribute("msgNuevoUsuario", msg);
            request.getRequestDispatcher("MensajeNuevoUsuario.jsp").forward(request, response);
            
	 	}else{ //Modifica
	 		Usuario usuarioActual = new Usuario();
	 		
	 		personaActual.setId(Integer.parseInt(id));
	 		
	 		usuarioActual.setId(Integer.parseInt(request.getParameter("idUsuario")));
	 		usuarioActual.setIdPersona(personaActual.getId());
	 		usuarioActual.setApellido(personaActual.getApellido());
	 		usuarioActual.setNombre(personaActual.getNombre());
	 		usuarioActual.setEmail(personaActual.getEmail());
	 		usuarioActual.setNombreUsuario(request.getParameter("nombreUsuario"));
	 		usuarioActual.setClave(request.getParameter("clave"));
	 		
	 	/*leo habilitado o deshab..*/	
	 		String estado = request.getParameter("habilitado");
	 		//System.out.println(habilitad);
	 		boolean habilitado =false;
	 		if (estado != null){
	 			habilitado = true;
	 		}
	 		
	 		usuarioActual.setHabilitado(habilitado);//cristian

	 		//usuarioActual.setHabilitado(Boolean.parseBoolean(request.getParameter("habilitado")));//cristian no anda

	 		
	 		
            personaActual.setUsuario(usuarioActual);

            //Aca modifico al usuario en el mismo momento que a la persona.
            lp.modificarPersona(personaActual);
            mostrarPersonas(response,request);
    		request.getRequestDispatcher("ABMPersonas.jsp").forward(request, response);
	 	}
	}
	
	public void mostrarPersonas(HttpServletResponse response, HttpServletRequest request) throws IOException{
		loPersonas lp = new loPersonas();
		ArrayList<Persona> listaPersonas = lp.recuperTodos(-1);
		request.setAttribute("personas", listaPersonas);
	}
	
	private String generaClave()
    {
	    Random rand = new Random();
	    int min = 10000, max = 99999;
	
	    // nextInt is normally exclusive of the top value,
	    // so add 1 to make it inclusive

		int randomNum = rand.nextInt(max - min + 1) + min;
	     
	    return Integer.toString(randomNum);
    }

    private String generaUsuario(Persona nuevaPersona)
    {
    	loUsuarios lu = new loUsuarios();
        String NombreUsu = nuevaPersona.getApellido() + nuevaPersona.getNombre();

        if (lu.existeUsuario(NombreUsu.toLowerCase()))
        {
            int ultID = lu.getUltimoID();

            NombreUsu = NombreUsu + Integer.toString(ultID + 1);
        }
        return NombreUsu.toLowerCase();
    }

}